package Q16_18_Pattern_Matcher;
public class QuestionD {
public static boolean doesMatch(String pattern, String value) {
if (pattern.length() == 0) return value.length() == 0;
char mainChar = pattern.charAt(0);
char altChar = mainChar == 'a' ? 'b' : 'a';
int size = value.length();
int countOfMain = countOf(pattern, mainChar);
int countOfAlt = pattern.length() - countOfMain;
int firstAlt = pattern.indexOf(altChar);
int maxMainSize = size / countOfMain;
for (int mainSize = 0; mainSize <= maxMainSize; mainSize++) {
int remainingLength = size - mainSize * countOfMain;
if (countOfAlt == 0 || remainingLength % countOfAlt == 0) {
int altIndex = firstAlt * mainSize;
int altSize = countOfAlt == 0 ? 0 : remainingLength / countOfAlt;
if (matches(pattern, value, mainSize, altSize, altIndex)) {
return true;
}
}
}
return false;
}
public static boolean matches(String pattern, String value, int mainSize, int altSize, int firstAlt) {
int stringIndex = mainSize;
for (int i = 1; i < pattern.length(); i++) {
int size = pattern.charAt(i) == pattern.charAt(0) ? mainSize : altSize;
int offset = pattern.charAt(i) == pattern.charAt(0) ? 0 : firstAlt;
if (!isEqual(value, offset, stringIndex, size)) {
return false;
}
stringIndex += size;
}
return true;
}
public static boolean isEqual(String s1, int offset1, int offset2, int size) {
for (int i = 0; i < size; i++) {
if (s1.charAt(offset1 + i) != s1.charAt(offset2 + i)) {
return false;
}
}
return true;
}
public static int countOf(String pattern, char c) {
int count = 0;
for (int i = 0; i < pattern.length(); i++) {
if (pattern.charAt(i) == c) {
count++;
}
}
return count;
}
public static void main(String[] args) {
String[][] tests = {{"ababb", "backbatbackbatbat"}, {"abab", "backsbatbackbats"}, {"aba", "backsbatbacksbat"}};
for (String[] test : tests) {
String pattern = test[0];
String value = test[1];
System.out.println(pattern + ", " + value + ": " + doesMatch(pattern, value));
}
}
}